/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SensorDataDesktop;

import Adaptadores.AdaptadorServerUDPT;
import Adaptadores.FabricaAdaptador;
import Entidades.Configuracion;
import Persistencia.FachadaPersistencia;
import java.awt.Color;
import javax.swing.JOptionPane;

/**
 *
 * @author Luis
 */
public class ExpertoCUCapturarTramas {

    AdaptadorServerUDPT server;
    IUServer inter;
    Funcionamiento funcionamiento;
    Configuracion conf;

    public ExpertoCUCapturarTramas(IUServer i) {
        conf = FachadaPersistencia.getInstancia().obtenerConfiguracion();
        server = (AdaptadorServerUDPT) FabricaAdaptador.getFabricaAdaptador().getAdaptador("UDP", conf.getPuerto(), i);
        inter = i;
        funcionamiento = new Funcionamiento();
    }

    /**
     * Crea una instancia del AdaptadorServerUDPT y comienza a escuchar el
     * puerto ingresado en la interfaz de usuario
     */
    public void recibir() {
        if (isNumber(inter.getPort().getText())) {
            if (verificarPuerto(Integer.parseInt(inter.getPort().getText()))) {
                inter.getStart().setEnabled(false);
                inter.getPort().setEnabled(false);
                inter.getStop().setBackground(Color.red);
                inter.getStop().setEnabled(true);

                if (server.port != Integer.parseInt(inter.getPort().getText())) { // cambio de puerto
                    conf.setPuerto(Integer.valueOf(inter.getPort().getText()));
                    FachadaPersistencia.getInstancia().guardar(conf);
                    if (server.isAlive()) {
                        server.aSocket.close();
                    }
                    server = (AdaptadorServerUDPT) FabricaAdaptador.getFabricaAdaptador().getAdaptador("UDP", Integer.parseInt(inter.getPort().getText()), inter);
                    server.setInter(inter);
                    System.out.println(server.port);
                    server.start();
                } else {
                    if (!server.isAlive()) { // nunca se ejecutó
                        server.start(); //arranco el thread
                        System.out.println(server.port);
                    } else {
                        server.resume(); //reanudo el thread si ya se arranco anteriormente 
                    }
                }
            } else {
                JOptionPane.showMessageDialog(null, "El número de puerto debe ser entre 0 y 65535.");
            }
        } else {
            JOptionPane.showMessageDialog(null, "Debe ingresar un número entero.");
        }
    }

    /**
     * Pone en pausa el escuchador del puerto
     */
    public void parar() {
        inter.getStop().setEnabled(false);
        inter.getPort().setEnabled(true);
        server.suspend(); // paro el thread
        inter.getStart().setEnabled(true);
    }

    /**
     * Verifica que los datos ingresados sean un número entero
     *
     * @param numero String número de puerto
     * @return true si los datos corresponden a un número entero, false si es
     * incorrecto
     */
    private boolean isNumber(String numero) {
        try {
            Long.parseLong(numero);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * Verifica que el número de puerto sea ingresado correctamente
     *
     * @param p número de puerto ingresado
     * @return true si es está entre los números de puertos correctos, false si
     * no lo está
     */
    private boolean verificarPuerto(int p) {
        if (p < 0) {
            return false;
        } else {
            if (p > 65535) {
                return false;
            } else {
                return true;
            }
        }
    }

    public void controlarEquipos() {
        if (!funcionamiento.isAlive()) {
            System.out.println(funcionamiento.isAlive());// nunca se ejecutó
            funcionamiento.start();
        } else {
            funcionamiento.resume(); //reanudo el thread si ya se arranco anteriormente 
        }

    }

    public void pararControlEquipo() {
        funcionamiento.suspend();
    }

    public String getPuerto() {
        return conf.getPuerto().toString();
    }
}
